/*
 * 2022/1/6	14:42	qing
 */

/*
 * 堆栈溢出
 */
	当程序从外部世界接收数据时，不管这些数据是用户直接输入的还是通过网络连接拷贝到堆栈中的，只要不检查数据长度，就会发生简单的堆栈溢出。
	这是由于堆栈的大小是固定的，因为编译器产生的、用来访问堆栈的偏移量是预先确定的，并硬编码在了机器码中。这意味着程序不能根据要传递的信息量
	的大小动态分配堆栈空间，它必须为预期接收的最大的数据块在堆栈中预先分配足够的空间。当然，正确编写的代码会在拷贝数据之前验证所接收的数据是否
	能够放入堆栈缓冲区，但常常忘记进行这种验证。


/*
 * 一个的简单堆栈漏洞
 */
	当应用程序在堆栈中存储一个临时的缓冲区，从缓冲区外接收长度可变的输入到缓冲区时，最普通的溢出错误就发生了。最经典的例子是函数接收一个以null为
	结束符的字符串作为输入，并把这个字符串拷贝到一个局部变量中。

	00401060 mov eax, [esp+0x4]
			 sub esp, 0x64
			 push eax
			 lea ecx, [esp+0x4]
			 push ecx
			 call strcpy
			 lea edx, [esp+0x8]
			 push 408128
			 push edx
			 call strcat
			 lea eax, [esp+0x10]
			 push eax
			 call system
			 add esp, 0x78
			 ret

	给出这个函数的堆栈布局。

	它先从[esp+4]读取一个参数，然后从ESP减去100个字节，为局部变量腾出空间。在函数末尾，可以看到将ESP移回到第一次进入这个函数时它所在位置的代码。
	这行代码就是 add esp, 0x78, 但是为什么这里加上的是120个字节，而不是100个字节？

/*
 * 容易受到攻击的launch函数
 */
	00401060 mov eax, [esp+4]
			 lea dex, [esp-0x64]
			 sub esp, 0x64
			 sub edx, eax
			 lea ecx, [ecx]
			 mov cl, [eax]
			 mov [edx+eax], cl
			 inc eax
			 test cl, cl
			 jnz launch+10 (00401070)
			 push edi
			 lea edi, [esp+4]
			 dec edi
			 mov al, [edi+1]
			 inc edi
			 test al, al
			 jnz 00401080
			 mov eax, 'string'
			 mov cl, 'string'+4
			 lea edx, [esp+4]
			 mov [edi], eax
			 push edx
			 mov [edi+4], cl
			 call system
			 add esp, 4
			 pop edi
			 add esp, 64
			 ret

	即便不考虑内置的字符串操作函数，任何在堆栈变量地址(像上面那个函数中用"lea edx, [esp-64]"获得的变量地址)上出现函数循环的情况都有是值得
	深入研究的。

	增加堆栈检查：

	00401060 sub esp, 68
			 mov eax, __security_cookie
			 mov [esp+64], eax
			 mov eax, [esp+6c]
			 lea edx, [esp]
			 sub edx, eax
			 mov cl, [eax]
			 mov [edx+eax], cl
			 inc eax
			 test cl, cl
			 jnz 00400175
			 push edi
			 lea edi, [esp+4]
			 dec edi
			 mov al, [edi+1]
			 inc edi
			 test al, al
			 jnz 00401085
			 mov eax, 'string'
			 mov cl, 'string'+4
			 lea edx, [esp+4]
			 mov [edi], eax
			 push edx
			 mov [edi+4], cl
			 call system
			 mov ecx, [esp+6c]
			 add esp, 4
			 pop edi
			 call __security_check_cookie
			 add esp, 68
			 ret

	__security_check_cookie:
	
	004011d7 cmp ecx, __seurity_cookie
			 jnz __security_check_cookie+9
			 ret
			 jmp report_filure
